package es.nadalgoyo.frikiquest.action;

import java.util.List;

import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import es.nadalgoyo.frikiquest.bbdd.tablas.TablaPuntuaciones;
import es.nadalgoyo.frikiquest.util.Constantes;
import es.nadalgoyo.frikiquest.vo.PuntuacionesVO;
import es.sergionadal.mvc.action.exception.ActionException;
import es.sergionadal.mvc.dispatcher.AbstractDispatcher;

public class ActionGuardar extends Action {

	public static final String PUNTOS = "0";

	public static final String NOMBRE = "1";

	public static final String TIPO = "2";

	public static final String TOP_TIEMPO = "3";

	public static final String TOP_APUESTA = "4";

	public ActionGuardar(AbstractDispatcher dispatcher) {
		super(dispatcher);
	}

	@Override
	protected Bundle getBundle() throws ActionException {
		Bundle bundleToSave = getDispatcher().getBundle();
		Bundle bundle = new Bundle();
		SQLiteDatabase db = getDatabase();
		String tipo = bundleToSave.getString(TIPO);

		try {
			db.beginTransaction();

			TablaPuntuaciones puntuaciones = new TablaPuntuaciones();

			PuntuacionesVO puntos = new PuntuacionesVO(
					bundleToSave.getString(NOMBRE),
					bundleToSave.getString(TIPO), bundleToSave.getInt(PUNTOS));

			puntuaciones.setPuntuacion(puntos);

			long result = puntuaciones.insert(db);

			if (result != -1) {

				db.setTransactionSuccessful();

				List<PuntuacionesVO> topPuntuaciones = puntuaciones.getTopTen(
						db, bundleToSave.getString(TIPO));

				if (tipo.equals(Constantes.TIPO_TIEMPO))
					bundle.putSerializable(TOP_TIEMPO,
							topPuntuaciones.toArray());
				else
					bundle.putSerializable(TOP_APUESTA,
							topPuntuaciones.toArray());

			} else {
				throw new SQLException("No se ha podido insertar en la BBDD.");
			}

		} catch (SQLException e) {
			e.printStackTrace();
			throw new ActionException("Problema con la BBDD:" + e.getMessage());
		} finally {
			if (db != null) {
				if (db.inTransaction())
					db.endTransaction();
				db.close();
			}
		}

		return bundle;
	}

}
